package panels;

import java.awt.event.ComponentListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelListener;

import javax.swing.JPanel;
import javax.swing.event.MouseInputListener;

public abstract class JSpritePanel extends JPanel implements ComponentListener, MouseListener, MouseMotionListener, MouseInputListener, MouseWheelListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
//
//	/**
//	 * 
//	 */
//	private static final long serialVersionUID = -5788248289962832047L;
//	private Rectangle2D camera;			// Position of the camera in the canvas space
//	private double		zoom;			// Zoom factor we are using
//
//	private DDict<Integer,Boolean>		mPressed;
//	private DDict<Integer,Point2D>		mScreenDown; 
//	private DDict<Integer,Point2D>		mScreenUp; 
//	private DDict<Integer,Point2D>		mCanvasDown; 
//	private DDict<Integer,Point2D>		mCanvasUp;
//	
//	private Point2D						mScreenPos;
//	private Point2D						mCanvasPos;
//	
//	private ArrayList<Sprite>			sprites;
//	private String						output = "";
//	private	boolean						canPaint = true;
//	
//	public class MyPoint extends Point2D {
//		public double x, y;
//		
//		@Override
//		public double getX() {
//			return x;
//		}
//
//		@Override
//		public double getY() {
//			return y;
//		}
//
//		@Override
//		public void setLocation(double x, double y) {
//			this.x = x;
//			this.y = y;
//		}
//	}
//	
//	public class MyRect extends Rectangle2D {
//		public	double		x;
//		public	double		y;
//		public	double		w;
//		public	double		h;
//
//		@Override
//		public void setRect(double x, double y, double w, double h) {
//			this.x = x;
//			this.y = y;
//			this.w = w;
//			this.h = h;
//		}
//
//		@Override
//		public int outcode(double x, double y) {
//			int		mask		= 0;
//			
//			if (x<getX())				mask = mask | Rectangle2D.OUT_LEFT;
//			if (x>getX()+getWidth())	mask = mask | Rectangle2D.OUT_RIGHT;
//			if (y<getY())				mask = mask | Rectangle2D.OUT_TOP;
//			if (y>getY()+getHeight())	mask = mask | Rectangle2D.OUT_BOTTOM;
//			
//			return mask;
//		}
//
//		@Override
//		public Rectangle2D createIntersection(Rectangle2D r) {
//			double	maxX = Math.max(r.getX(), getX());
//			double	maxY = Math.max(r.getY(), getY());
//			double	minW = Math.min(r.getX()+r.getWidth()-maxX, getX()+getWidth()-maxX);
//			double	minH = Math.min(r.getY()+r.getHeight()-maxY, getX()+getHeight()-maxY);
//			return new MyRect(maxX, maxY, minW, minH);
////			return null;
//		}
//
//		@Override
//		public Rectangle2D createUnion(Rectangle2D r) {
//			double	minX = Math.min(r.getX(), getX());
//			double	minY = Math.min(r.getY(), getY());
//			double	maxW = Math.max(r.getX()+r.getWidth()-minX, getX()+getWidth()-minX);
//			double	maxH = Math.max(r.getY()+r.getHeight()-minY, getX()+getHeight()-minY);
//			return new myRect(minX,minY,maxW,maxH);
//			return null;
//		}
//
//		@Override
//		public double getX() {
//			return x;
//		}
//
//		@Override
//		public double getY() {
//			return y;
//		}
//
//		@Override
//		public double getWidth() {
//			return w;
//		}
//
//		@Override
//		public double getHeight() {
//			return h;
//		}
//
//		@Override
//		public boolean isEmpty() {
//			return (getWidth()<=0) || (getHeight()<=0);
//		}
//	}
//	
//	public class Sprite extends MyRect {
//		public String name;
//		
//		public Sprite(String name, double x, double y, double w, double h) {
//			setRect(x,y,w,h);
//			this.name = name;
//		}
//	}
//	
//	//
//	// Constructor
//	//
//	public JSpritePanel() {
//		setCamera(new MyRect());
//		
//		this.addComponentListener(this);
//		this.addMouseListener(this);
//		this.addMouseMotionListener(this);
//		this.addMouseWheelListener(this);
//		
//		camera = this.getVisibleRect();
//		
//		mScreenPos = new Point(0,0);
//		mCanvasPos = new Point(0,0);
//		
//		sprites = new ArrayList<Sprite>();
//		
//		mPressed	= new DDict<Integer,Boolean>(Boolean.FALSE);
//		mScreenDown = new DDict<Integer,Point2D>(new Point(0,0));
//		mScreenUp	= new DDict<Integer,Point2D>(new Point(0,0));
//		mCanvasDown = new DDict<Integer,Point2D>(new Point(0,0));
//		mCanvasUp	= new DDict<Integer,Point2D>(new Point(0,0));
//		
//		canPaint = true;
//		
//		testInit();
//	}
//	
//	public void testInit() {
//		
//	}
//	
//	private void println(String S) {
//		output = S;
//		refresh();
//	}
//	
//
//	private void refresh() {
//		this.paintImmediately(getVisibleRect());
//	}
//	
//	//
//	// Methods for creating new sprites
//	//
//	public void addSprite(String name, double x, double y, double width, double height) {
//		
//	}
//	
//	//
//	// Get screen data
//	//
//	public double screenWidth() {
//		return Math.max(Double.MIN_NORMAL, (double) getWidth());
//	}
//	public double screenHeight() {
//		return Math.max(Double.MIN_NORMAL, (double) getHeight());
//	}
//	
//	//
//	// Conversion methods between canvas and screen
//	//
//	public double toCanvasRatio() {
//		return 1D/zoom;
//	}
//	public double toScreenRatio() {
//		return zoom;
//	}
//	public double toScreenDyRatio() {
//		return screenHeight() / camera.getHeight();
////		return toScreenRatio();
//	}
//	public double toScreenDxRatio() {
//		return screenWidth() / camera.getWidth();
////		return toScreenRatio();
//	}
//	public double toCanvasDxRatio() {
//		return camera.getWidth() / screenWidth();
////		return toCanvasRatio();
//	}
//	public double toCanvasDyRatio() {
//		return camera.getWidth() / screenHeight();
////		return toCanvasRatio();
//	}
//	public double toCanvasX(double screenX) {
//		return screenX * toCanvasDxRatio() + camera.getX();
//	}
//	public double toCanvasY(double screenY) {
//		return screenY * toCanvasDyRatio() + camera.getY();
//	}
//	public double toScreenX(double canvasX) {
//		return (canvasX - camera.getX()) * toScreenDxRatio();
//	}
//	public double toScreenY(double canvasY) {
//		return (canvasY - camera.getY()) * toScreenDyRatio();
//	}
//	public Rectangle2D toCanvas(Rectangle2D R) {
//		Rectangle2D N = new Rectangle();
//		N.setRect(
//			toCanvasX(R.getX()),
//			toCanvasY(R.getY()),
//			toCanvasDxRatio() * R.getWidth(),
//			toCanvasDyRatio() * R.getHeight()
//		);
//		return N;
//	}
//	
//	public Point2D toCanvas(Point2D P) {
//		return new Point(
//			(int) toCanvasX(P.getX()),
//			(int) toCanvasY(P.getY())
//		);
//	}
//	
//	public Point2D toScreen(Point2D P) {
//		return new Point(
//			(int) toScreenX(P.getX()),
//			(int) toScreenY(P.getY())
//		);
//	}
//	
//	public Rectangle2D toScreen(Rectangle2D R) {
//		Rectangle2D N = new Rectangle();
//		N.setRect(
//			toScreenX(R.getX()),
//			toScreenY(R.getY()),
//			toScreenDxRatio() * R.getWidth(),
//			toScreenDyRatio() * R.getHeight()
//		);
//		return N;
//	}
//	public Rectangle2D zoomRect(Rectangle2D R, double Z) {
//		Rectangle2D N = new Rectangle();
//		N.setRect(
//			R.getCenterX() - R.getWidth()/2D * Z,
//			R.getCenterY() - R.getHeight()/2D * Z,
//			R.getWidth() * Z,
//			R.getHeight() * Z
//		);
//		return N;
//	}
//	public Rectangle2D minRect(Rectangle2D R) {
//		Rectangle2D N = new Rectangle();
//		N.setRect(
//			R.getX(),
//			R.getY(),
//			Math.min(1D, R.getWidth()),
//			Math.min(1D, R.getHeight())
//		);
//		return N;
//	}
//	public Point2D getScreenDrag(int button) {
//		return new Point(
//			(int) (mScreenPos.getX() - mScreenDown.get(button).getX() ), 
//			(int) (mScreenPos.getY() - mScreenDown.get(button).getY() )
//		);
//	}
//	public Point2D getCanvasDrag(int button) {
//		return new Point(
//			(int) (mCanvasPos.getX() - mCanvasDown.get(button).getX() ), 
//			(int) (mCanvasPos.getY() - mCanvasDown.get(button).getY() )
//		);
//	}
//	
//	//
//	// Methods for setting internal variables
//	//
//	public void setCamera(Rectangle2D R) {
//		camera = minRect(R);
//		refresh();
//	}
//	public Rectangle2D getCamera() {
//		return camera;
//	}
//	public Rectangle2D getScreen() {
//		return new Rectangle(0, 0, getWidth(), getHeight());
//	}
//	
//	private void DrawSprite(Graphics G, Sprite S) {
////		Rectangle2D R = toScreen(S.area);
////		G.setColor(Color.red);
////		G.fillRect(
////			(int) R.getX(), 
////			(int) R.getY(), 
////			(int) R.getWidth(), 
////			(int) R.getHeight()
////		);
////		G.setColor(Color.white);
////		G.drawRect(
////			(int) R.getX(), 
////			(int) R.getY(), 
////			(int) R.getWidth(), 
////			(int) R.getHeight()
////		);
//	}
//	
//	//
//	// Drawing methods
//	//
//	public void paint(Graphics G) {
//		if (canPaint==true) {
//			canPaint = false;
//			
//			println("paint");
//			
//			G.setColor(Color.black);
//			G.fillRect(0, 0, getWidth(), getHeight());
//			
//			G.setColor(Color.white);
//			G.drawLine(
//				(int) toScreenX(0), 
//				(int) toScreenY(0), 
//				(int) toScreenX(camera.getCenterX()), 
//				(int) toScreenY(camera.getCenterY())
//			);
//			
//			G.setColor(Color.red);
//			if (mPressed.get(MouseEvent.BUTTON1) == true) {
//				G.drawLine(
//					(int) mScreenDown.get(MouseEvent.BUTTON1).getX(),
//					(int) mScreenDown.get(MouseEvent.BUTTON1).getY(),
//					(int) mScreenPos.getX(), 
//					(int) mScreenPos.getY()
//				);
//			}
//			G.setColor(Color.green);
//			if (mPressed.get(MouseEvent.BUTTON2) == true) {
//				G.drawLine(
//					(int) mScreenDown.get(MouseEvent.BUTTON2).getX(),
//					(int) mScreenDown.get(MouseEvent.BUTTON2).getY(),
//					(int) mScreenPos.getX(), 
//					(int) mScreenPos.getY()
//				);
//			}
//			G.setColor(Color.blue);
//			if (mPressed.get(MouseEvent.BUTTON3) == true) {
//				G.drawLine(
//					(int) mScreenDown.get(MouseEvent.BUTTON3).getX(),
//					(int) mScreenDown.get(MouseEvent.BUTTON3).getY(),
//					(int) mScreenPos.getX(), 
//					(int) mScreenPos.getY()
//				);
//			}
//			
//			G.setColor(Color.yellow);
//			G.drawRect(
//				(int) toCanvasX(0),
//				(int) toCanvasY(0),
//				(int) (10 * toCanvasDxRatio()),
//				(int) (10 * toCanvasDyRatio())
//			);
//			
//			G.setColor(Color.white);
//	
//			Iterator<Sprite>	itr = sprites.iterator();
//			while(itr.hasNext()) {
//				Sprite 			S = itr.next();
//				DrawSprite(G,S);			
//			}
//			
//			G.setColor(Color.yellow);
//			G.drawString(
//				output, 
//				(int) mScreenPos.getX(), 
//				(int) mScreenPos.getY()
//			);
//			canPaint = true;
//		}
//	}
//	
//	//
//	// Input methods
//	//
//	@Override
//	public void mouseWheelMoved(MouseWheelEvent e) {
//		println("mouseWheelMoved");
//		
//		double	dir = e.getPreciseWheelRotation();
//		if (dir<0D) {
//			setCamera( zoomRect( camera, 1.5D));
//		} else if (dir>0D) {
//			setCamera( zoomRect( camera, 1D/1.5D));
//		}
//	}
//
//	@Override
//	public void mouseDragged(MouseEvent e) {
//		println("mouseDragged");
//		
//		mScreenPos = e.getPoint();
//		mCanvasPos = toCanvas(mScreenPos);
//		
//		refresh();
//		if (mPressed.get(MouseEvent.BUTTON1) == true) {
//			Point2D V = getCanvasDrag(MouseEvent.BUTTON1);
//			setCamera(
//				new Rectangle(
//					(int) ( mCanvasDown.get(0).getX() - V.getX() ),
//					(int) ( mCanvasDown.get(0).getY() - V.getY() ),
//					(int) camera.getWidth(),
//					(int) camera.getHeight()
//				)
//			);
//		}
//	}
//
//	@Override
//	public void mouseMoved(MouseEvent e) {
//		println("mouseMoved");
//		
//		mScreenPos = e.getPoint();
//		mCanvasPos = toCanvas(mScreenPos);
//	}
//
//	@Override
//	public void mouseClicked(MouseEvent e) {
//		println("mouseClicked");
//		
//	}
//
//	@Override
//	public void mousePressed(MouseEvent e) {
//		println("mousePressed");
//		
//		mScreenDown.put(e.getButton(), e.getPoint());
//		mCanvasDown.put(e.getButton(), toCanvas(e.getPoint()));
//		mPressed.put(e.getButton(), Boolean.TRUE);
//	}
//
//	@Override
//	public void mouseReleased(MouseEvent e) {
//		println("mouseReleased");
//		
//		mScreenUp.put(e.getButton(), e.getPoint());
//		mCanvasUp.put(e.getButton(), toCanvas(e.getPoint()));
//		mPressed.put(e.getButton(), Boolean.FALSE);
//	}
//
//	@Override
//	public void mouseEntered(MouseEvent e) {
//		println("mouseEntered");
//		
//		// TODO Auto-generated method stub
//		
//	}
//
//	@Override
//	public void mouseExited(MouseEvent e) {
//		println("mouseExited");
//		
//		// TODO Auto-generated method stub
//		
//	}
//
//	@Override
//	public void componentResized(ComponentEvent e) {
//		println("componentResized");
//		
//		refresh();
//	}
//
//	@Override
//	public void componentMoved(ComponentEvent e) {
//		println("componentMoved");
//		
//		// TODO Auto-generated method stub
//		
//	}
//
//	@Override
//	public void componentShown(ComponentEvent e) {
//		println("componentShown");
//		
//		// TODO Auto-generated method stub
//		refresh();
//	}
//
//	@Override
//	public void componentHidden(ComponentEvent e) {
//		println("componentHidden");
//		
//		// TODO Auto-generated method stub
//		
//	}
//	
}
